package com.hongji.lms5xxcommunicator.grid.region;

import lombok.Value;
import lombok.Builder;

import java.io.Serializable;
import java.util.Comparator;

/**
 * <p>
 * 区域格峰值（CellPeak）：表示一个栅格单元的中心坐标及其均值高度。<br/>
 * </p>
 *
 * <p><b>职责</b></p>
 * <ul>
 *   <li>记录所在格的行列索引 ({@code row}/{@code col})。</li>
 *   <li>记录该格中心点坐标 ({@code xCenter}/{@code yCenter})。</li>
 *   <li>保存该格的均值高度 {@code meanZ}。</li>
 *   <li>提供比较器，支持按高度优先选出“最高格”。</li>
 * </ul>
 *
 * <p><b>用法</b></p>
 * <ol>
 *   <li>通过 Lombok 自动生成的 getter 方法访问字段。</li>
 *   <li>使用 {@link #BY_MEANZ_DESC} 排序或选取最高值。</li>
 * </ol>
 *
 */
@Value
@Builder
public class CellPeak implements Serializable {
    /** 行索引 */
    int row;
    /** 列索引 */
    int col;
    /** 格中心 X 坐标 */
    double xCenter;
    /** 格中心 Y 坐标 */
    double yCenter;
    /** 格的均值高度 */
    double meanZ;

    private static final long serialVersionUID = 1L;

    /**
     * <p>
     * 比较器：按 {@code meanZ} 降序，其次 {@code row}/{@code col} 升序。<br/>
     * 用于在多个候选格中选出“最高格”。
     * </p>
     */
    public static final Comparator<CellPeak> BY_MEANZ_DESC =
            Comparator.comparingDouble(CellPeak::getMeanZ)
                    .reversed()
                    .thenComparingInt(CellPeak::getRow)
                    .thenComparingInt(CellPeak::getCol);
}
